 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do;jsessionid=4FCCB481C702D708A7360133D128E359?Id=235 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:27:21 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Beware of unknown root causes
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Beware of unknown root causes</div>

<div class='main-body'>
 
<br>All exceptions are based on the <a href='http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html'>Throwable</a> class.
By default, all <tt>Throwable</tt>s can have an underlying <i>root cause</i>. The root cause may be set in the Throwable's 
constructor, or after construction by calling <a href='http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html#initCause(java.lang.Throwable)'>initCause</a>.

<P>Having the root cause is very useful for troubleshooting. 
However, there is a case in which root causes can cause a problem. 
When a <tt>Throwable</tt> is passed over the network, it must first be serialized, and then reconstructed (deserialized) on the other end.
If the root cause inside a <tt>Throwable</tt> object is not known to the receiver on the other end, then what happens?
The receiver will throw a <a href='http://java.sun.com/javase/6/docs/api/java/lang/NoClassDefFoundError.html'>NoClassDefFoundError</a>.
Of course, this replaces the original exception with something unrelated.

<P>One option is to define a "locked down" exception, which can hold only <tt>null</tt> as the root cause.

<p><b>Example</b>

<P>This class is a checked exception which cannot take a root cause.
<br>
<PRE>

<span class='comment'>/**
  A checked exception that cannot be given a root cause.
  
  All calls to {@link #getCause()} will return &lt;tt&gt;null&lt;/tt&gt;.
  This class cannot be subclassed. 
*/</span>
<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> LockedDownException <span class='keyword'>extends</span> Exception {
  
  <span class='comment'>/**
   The sole constructor.
   No root cause can be passed to this constructor.  
  */</span>
  <span class='keyword'>public</span> LockedDownException(String aMessage){
    <span class='keyword'>super</span>(aMessage);
  }
  
  <span class='comment'>/**
    Always coerces the root cause to &lt;tt&gt;null&lt;/tt&gt;.
    
    &lt;P&gt;Even though the caller is allowed to call this method, it will never have any 
    effect. The caller is not allowed to set the root cause, neither during construction, 
    nor after construction.
   */</span>
  <span class='keyword'>@Override</span> <span class='keyword'>public</span> <span class='keyword'>synchronized</span> Throwable initCause(Throwable aRootCause) {
    <span class='keyword'>return</span> <span class='keyword'>super</span>.initCause(<span class='keyword'>null</span>);
  }
  

  <span class='comment'>/** Simple test harness. */</span>
  <span class='keyword'>public</span> <span class='keyword'>static</span> <span class='keyword'>void</span> main(String... aArgs){
    LockedDownException ex = <span class='keyword'>new</span> LockedDownException(<span class='literal'>"Hello"</span>);
    ex.initCause(<span class='keyword'>new</span> IllegalArgumentException(<span class='literal'>"Test"</span>));
    System.out.println(ex.getCause()); <span class='comment'>//prints 'null'
</span>  }
} 
</PRE>
<br>
<br>
<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicActionf6c1-2.html?Id=77'>Data exception wrapping</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='235'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do;jsessionid=4FCCB481C702D708A7360133D128E359?Id=235 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:27:21 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
